<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script>
        /* 
            在 JavaScript 中，每个对象都有一个内部链接（指针）指向另一个对象，
                这个对象就是它的原型（prototype）。
            这个结构形成了所谓的 原型链（prototype chain）。
            每个函数都有 prototype 属性
            p1 -> Person.prototype -> Object.prototype -> null
        */

        function Person(name) {
            this.name = name;
        };

        Person.prototype.sayHello = function () {
            console.log(`你好，我是 ${this.name}`);
        };

        const p1 = new Person("小明");

        p1.sayHello(); // 输出：你好，我是 小明

        /* 
            p1 是 Person 的实例，本身没有 sayHello 方法。
            JavaScript 自动沿着 p1.__proto__（即 Person.prototype）找到 sayHello。
            执行成功！
        */
        /* 
            访问一个对象的原型对象
                对象.__proto__
                Object.getPrototypeOf(对象)

            原型对象中的数据:
                1. 对象中的数据(属性、方法等)
                2. constructor (对象的构造函数)

            注意:
                原型对象也有原型，这样就构成了一条原型链，
                根据对象的复杂程度不同，原型链的长度也不同
        */

    </script>
</head>

<body>

</body>

</html>